%%%-------------------------------------------------------------------
%%% @author Rain
%%% @doc 游戏配置模块
%%% @end
%%%-------------------------------------------------------------------
-module(game_config).
-author("Rain").
-include_lib("game_util/include/game_util_dyn_compile.hrl").

%% API
-export([load_all_config/1]).
-export([get/2, get/3]).
-export([get_default/1, get_default/2]).

-export([get_default_config/0, set_default_config/1]).

%% @doc 加载ConfigDir下所有配置
load_all_config(ConfigDir) ->
    Pattern = filename:join(ConfigDir, "*.config"),
    ConfigFiles = filelib:wildcard(Pattern),
    loop_load_config(ConfigFiles).


%% @doc 加载game配置
loop_load_config([]) ->
    ok;
loop_load_config([ConfigFile | T]) ->
    {ok, Terms} = file:consult(ConfigFile),
    ConfigName = filename:basename(ConfigFile, ".config"),
    SimpleArgs = [{?SIMPLE_DYN_TYPE_KV, get, Terms}],
    ConfigMod = name_to_config_mod(ConfigName),
    %% 生成的名字都是 dyn_cfg_ConfigName, ConfigName是 xxx.config里面的xxx
    game_util_dyn_compile:simple_compile(ConfigMod, SimpleArgs),
    loop_load_config(T).

%% @doc 获取默认配置
get_default(Key) ->
    get_default(Key, undefined).
get_default(Key, Def) ->
    case get_default_config() of
        undefined ->
            Def;
        ConfigName ->
            get(ConfigName, Key, Def)
    end.

%% @doc 获取指定配置文件的配置
%% ConfigKey :: string() | atom()
%% Key :: atom()
get(ConfigKey, Key) ->
    get(ConfigKey, Key, undefined).
get(ConfigKey, Key, Def) ->
    ConfigMod = name_to_config_mod(ConfigKey),
    case ConfigMod:get(Key) of
        undefined ->
            Def;
        Any ->
            Any
    end.

%% @doc 配置名字转换为配置模块
name_to_config_mod(ConfigName) when is_list(ConfigName) ->
    list_to_atom("dyn_cfg_" ++ ConfigName);
name_to_config_mod(ConfigName) when is_atom(ConfigName) ->
    list_to_atom("dyn_cfg_" ++ atom_to_list(ConfigName)).


%% @doc 获取默认配置
get_default_config() ->
    persistent_term:get({game_config, default}, undefined).

%% @doc 设置默认配置
set_default_config(ConfigName) ->
    persistent_term:put({game_config, default}, ConfigName).